#!/usr/bin/env node

/**
 * API生成CLI工具
 * 根据Swagger文档生成API接口和类型定义
 */

import { readFileSync, writeFileSync } from 'fs';
import { SwaggerParser, loadSwaggerFromUrl, generateApiClient } from '../src/utils/swagger.js';

const args = process.argv.slice(2);
const command = args[0];

if (!command) {
  console.log(`
Swagger API 生成工具

用法:
  node scripts/generate-api.js <command> [options]

命令:
  from-url <url> [output]     从URL加载Swagger文档并生成API
  from-file <file> [output]   从文件加载Swagger文档并生成API
  help                        显示帮助信息

选项:
  --types-only               只生成类型定义
  --methods-only             只生成API方法
  --output <file>            指定输出文件

示例:
  node scripts/generate-api.js from-url https://api.example.com/swagger.json
  node scripts/generate-api.js from-file swagger.json --output api-client.ts
  node scripts/generate-api.js from-file swagger.json --types-only
`);
  process.exit(0);
}

async function generateFromUrl(url, outputFile) {
  try {
    console.log(`正在从 ${url} 加载Swagger文档...`);
    const parser = await loadSwaggerFromUrl(url);
    
    console.log('Swagger文档加载成功');
    console.log(`- API接口数量: ${parser.parseApis().length}`);
    console.log(`- 枚举数量: ${parser.parseEnums().length}`);
    
    const code = generateApiClient(parser);
    
    if (outputFile) {
      writeFileSync(outputFile, code, 'utf8');
      console.log(`API客户端代码已生成到: ${outputFile}`);
    } else {
      console.log('\n=== 生成的API客户端代码 ===');
      console.log(code);
    }
  } catch (error) {
    console.error('生成失败:', error.message);
    process.exit(1);
  }
}

async function generateFromFile(filePath, outputFile) {
  try {
    console.log(`正在从 ${filePath} 加载Swagger文档...`);
    const content = readFileSync(filePath, 'utf8');
    const swaggerDoc = JSON.parse(content);
    const parser = new SwaggerParser(swaggerDoc);
    
    console.log('Swagger文档加载成功');
    console.log(`- API接口数量: ${parser.parseApis().length}`);
    console.log(`- 枚举数量: ${parser.parseEnums().length}`);
    
    const code = generateApiClient(parser);
    
    if (outputFile) {
      writeFileSync(outputFile, code, 'utf8');
      console.log(`API客户端代码已生成到: ${outputFile}`);
    } else {
      console.log('\n=== 生成的API客户端代码 ===');
      console.log(code);
    }
  } catch (error) {
    console.error('生成失败:', error.message);
    process.exit(1);
  }
}

// 解析命令行参数
function parseArgs() {
  const options = {
    typesOnly: false,
    methodsOnly: false,
    output: null
  };
  
  for (let i = 0; i < args.length; i++) {
    const arg = args[i];
    if (arg === '--types-only') {
      options.typesOnly = true;
    } else if (arg === '--methods-only') {
      options.methodsOnly = true;
    } else if (arg === '--output' && i + 1 < args.length) {
      options.output = args[i + 1];
      i++;
    }
  }
  
  return options;
}

// 主程序
async function main() {
  const options = parseArgs();
  
  switch (command) {
    case 'from-url':
      const url = args[1];
      if (!url) {
        console.error('错误: 请提供Swagger文档URL');
        process.exit(1);
      }
      await generateFromUrl(url, options.output);
      break;
      
    case 'from-file':
      const file = args[1];
      if (!file) {
        console.error('错误: 请提供Swagger文档文件路径');
        process.exit(1);
      }
      await generateFromFile(file, options.output);
      break;
      
    case 'help':
      console.log(`
Swagger API 生成工具

用法:
  node scripts/generate-api.js <command> [options]

命令:
  from-url <url> [output]     从URL加载Swagger文档并生成API
  from-file <file> [output]   从文件加载Swagger文档并生成API
  help                        显示帮助信息

选项:
  --types-only               只生成类型定义
  --methods-only             只生成API方法
  --output <file>            指定输出文件

示例:
  node scripts/generate-api.js from-url https://api.example.com/swagger.json
  node scripts/generate-api.js from-file swagger.json --output api-client.ts
  node scripts/generate-api.js from-file swagger.json --types-only
`);
      break;
      
    default:
      console.error(`未知命令: ${command}`);
      console.log('使用 "node scripts/generate-api.js help" 查看帮助信息');
      process.exit(1);
  }
}

main().catch(console.error);

